<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="httli://www.w3.org/1999/xhtml">
<head>
    <title>邮件模板</title>
    <link href="../Css/document.css" rel="stylesheet" type="text/css" />
    <script src="../JavaScript/packages/jquery-1.8.0.min.js" type="text/javascript"></script>
    <script src="../JavaScript/packages/jquery-syntax-3.1.1/public/jquery.syntax.min.js" type="text/javascript"></script>
	<script type="text/javascript">
	    $(function () {
	        $.syntax({ blockLayout: "fixed", theme: "paper" });
	    });
	</script>
</head>
<body>


    <p>
        NVelocity是一个基于.NET的模板引擎（template engine）。它允许任何人仅仅简单的使用模板语言（template 
        language）来引用由.NET代码定义的对象。从而使得界面设计人员与.NET程序开发人员基本分离。</p>
    <p>
    </p>
    <p>
        &nbsp;一、nVelocity的常用功能简介</p>
    <p>
&nbsp;&nbsp;&nbsp; 1、 在页面中定义变量，并进行简单的运算。</p>
    <p>
&nbsp;&nbsp;&nbsp; 2、 在页面中获得对后台程序实体对象的引用。</p>
    <p>
&nbsp;&nbsp;&nbsp; 3、 在页面中迭代实体对象集合。</p>
    <p>
&nbsp;&nbsp;&nbsp; 4、 在页面中获得实体对象的属性，及其方法。</p>
    <p>
&nbsp;&nbsp;&nbsp; 5、 对逻辑判断语句的支持。</p>
    <p>
&nbsp;&nbsp;&nbsp; 6、 对外部文件的引用。</p>
    <p>
&nbsp;&nbsp;&nbsp; 7、 对外部文件的解析。</p>
    <p>
        二、nVelocity的工作原理</p>
    <p>
&nbsp;&nbsp;&nbsp; 可以使用.NET的反射实现。以下是nVelocity对迭代实体类的简单实现步骤：</p>
    <p>
&nbsp;&nbsp;&nbsp; 1、 定义People类，并拥有Name与Sex属性。表示一个人。</p>
    <p>
&nbsp;&nbsp;&nbsp; 2、 在页面中列出人物列表，则输入以下代码：</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #foreach($p in $ps)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;欢迎您：$p.Name&lt;/p&gt;</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end</p>
    <p>
&nbsp;&nbsp;&nbsp; 3、 获取人物列表，保存在_List中。并指定页面中的字符串“ps”对应_List。</p>
    <p>
&nbsp;&nbsp;&nbsp; 4、以文本方式读取模板文件，并匹配#foreach…#end段，如果匹配到则继续匹配$X in $XX 
        段，分别记录用于保存集合与单项的字符，本次为“p”与“ps”。</p>
    <p>
&nbsp;&nbsp;&nbsp; 5 、用Type对象的GetProperties()方法获取_list中每一项的所有属性，并在#foreach &nbsp;#end段中循环将$p 
        + 属性名称替换为当前对象的当前属性的值。当然如果要调用对象的方法也可以用同样的方式获得。</p>
    <p>
    </p>
    <p>
        三、基本语法</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;1、特殊字符介绍</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;A、“#”：表示开始做什么事情。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        &nbsp;B、“$”：表示用于获得什么。(以$开头的表示“引用”意思是取得一些东东.可引用变量，属性，方法)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;C、“##“：单行注释。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;D、 “#*… …*#”：多行注释。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;2、关键字</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A、 
        Set：开始做什么事情，比如定义变量，给变量重新赋值等。(注意：如果右边的操作数是一个属性或命令的引用而返回null,那么赋值将不会成功，且在随后的VTL中也不能再取出使用,如果要用做if条件，一个解决办法是，先给变量赋一个值，然后再将一个属性或命令的引用赋给该变量)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B、 Foreach：迭代语句</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C、 If：条件判断语句</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D、 Elseif</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E、 Else</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F、 Include：对外部文件的引用，开始位置为模板路径。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; G、 
        Parse：对外部文件的引用，并用nVelocity方式解析。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; H、 Macro：创建宏，可以重复做某件事，类似于方法。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I、 &nbsp;Even：双数执行</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J、 &nbsp;Odd ：单数执行</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; K、 Each：每次都执行</p>
    <p>
&nbsp;&nbsp;&nbsp; 
        （备注：所有变量在未定义之前不能使用（因为我们习惯了有全局变量的习惯），一个合法的VTL标示符是以一个字母开头的。.NET后台定义的对象除外。模板语言区分大小写，所有的关键字必须为小写，默认情况下，NVelocity解析是不分大小写的，当然可以通过设置 
        runtime.strict.math=true，采用严格解析模式。）</p>
    <p>
    </p>
    <p>
        四、使用示例</p>
    <p>
&nbsp;&nbsp;&nbsp; 1、 &nbsp;在页面中使用变量</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义变量：#set($a = “CNF”)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用变量：欢迎光临：$a</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;定义变量：#set($a = 1)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;运算：#set($a = $a + 1)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;输出：$a&nbsp;&nbsp; ##得：2</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;运算：#set($a = $a*5)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;输出：$a&nbsp;&nbsp; ##得：10</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#set( $criteria = [&quot;name&quot;, &quot;address&quot;] )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#foreach( $criterion in $criteria )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#set( 
        $result = false ) &nbsp;//先设置默认值</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#set( 
        $result = $query.criteria($criterion) )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#if( 
        $result )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        &nbsp;Query was successful</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#end</p>
    <p>
&nbsp;&nbsp;&nbsp; 
        &nbsp;（备注：从以上可以看出nVelocity的替换顺序与.NET程序代码的执行基本一致，如果放在Foreach语句块中可以实现累加。并用If语句获得行号，对特殊行号的内容特殊处理。所有变量在未定义之前不能使用，.NET后台对象除外，最好采用正规引用格式，${a},正规引用格式一般用于在模板中直接调整字符串内容；静态引用输出:NVelocity遇到一个不能处理的引用时，一般他会直接输出这个引用$email的写法,页面上会看到的是$email,我们可以在$后面加上一个!号，那么就会输出空白.$!{email}如果不能处理会输出空白。如果email己定义了 
        (比如它的值是 foo),而这里你却想输出 $email. 这样一个字符串,就需要使用转义字符”\”，如：\$email）</p>
    <p>
&nbsp;&nbsp;&nbsp; 2、 &nbsp;在页面中使用条件判断语句</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #if ($p.StrSex == &quot;女&quot;)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #set($Sex = &quot;女士&quot;)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#elseif ($p.StrSex == &quot;男&quot;)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #set($Sex = &quot;先生&quot;)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#elseif ($p.StrSex == &quot;无&quot;)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #set($Sex = &quot;人妖&quot;)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#else</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #set($Sex = &quot;怪物&quot;)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#end</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;（备注：可以嵌套在Foreach语句块中，用于对每个列表对象进行特殊显示处理。）</p>
    <p>
&nbsp;&nbsp;&nbsp; 3、 &nbsp;创建宏，可以当做方法使用。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
    <p>
    </p>
    <p>
        创建：#macro(Add $a $b)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#set($c = $a + $b)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;最后结果：$c&lt;/p&gt;</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end</p>
    <p>
        &nbsp;调用：#Add(1 2)</p>
    <p>
&nbsp; &nbsp;</p>
    <p>
&nbsp; &nbsp;（备注：模板引擎的初始化方法有3种，一种参数为模板文件内容，一种是带模板文件地址。结果发现带模板文件内容的，在应用宏的时候好像有点问题。另外一个就是假如在宏里面加入一个判断语句，则可以实现递归调用。）</p>
    <p>
&nbsp;&nbsp;&nbsp; 4、使用对象方法</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义变量：#set($str = “CNF”)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用方法：$str.SubString(0,1)&nbsp;</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;输出：C</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;定义变量：#set($a = 123)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;调用方法：$a.GetType()</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;输出：System.Int32</p>
    <p>
&nbsp;&nbsp;&nbsp; （备注：不管是.NET代码定义的对象，还是设计人员在页面中定义的变量，都可以使用对象的方法及属性，这一点非常强大。）</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;5、使用even与odd简化代码，each辅助</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        &nbsp;如上面所说用IF语句可以在列表中为每行创建不同的样式，但如果只需要区分单行与双行的话，可以使用even与odd简化代码。如下：</p>
    <p>
&nbsp; &nbsp;&nbsp;</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;#foreach($p in $ps)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #even</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        &lt;p&gt;双行：$p.StrName&lt;/p&gt;</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#odd</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;单行：$p.StrName&lt;/p&gt;</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end</p>
    <p>
&nbsp;&nbsp;&nbsp; （备注：在使用这两个关键字时，出现了与创建宏一样的问题，即在初始化模板引引擎的时候，如果是用模板文件内容初始化的，会出现问题）</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;6、引用外部文件</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        Include与parse都有引入外部文件的作用，不同的是parse会根据nVelocity模板语言解析外部文件。也就是说如果引入当前模板，则会出现死循环。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include 
        脚本元素让模板设计者可以在模板中引入一个本地文件, 这个被引入的文件将不会经过NVelocity的解析. 
        安全起见，可以引放的文件只是是配置参数TEMPLATE_ROOT所定义目录下的，默认为当前目录下.</p>
    <p>
    </p>
    <p>
        #include( &quot;head.html&quot; )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果需要引入多个文件，可以像下面这样. &nbsp;&nbsp;</p>
    <p>
    </p>
    <p>
        #include( &quot;one.gif&quot;,&quot;two.txt&quot;,&quot;three.htm&quot; )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，还可用一个变量名来代替文件名引入.&nbsp;&nbsp; 
        &nbsp;</p>
    <p>
    </p>
    <p>
        #include( &quot;greetings.txt&quot;, $seasonalstock )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #parse 元素指示可以引入一个包含TVL的本地文件，这个文件将被NVeloict engine解析输出。</p>
    <p>
    </p>
    <p>
        #parse( &quot;me.vm&quot; )</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;与 #include 指令不同, #parse 
        可以从引入的模板中得到变量引用.但#parse指令只能接受一个参数.VTL templates 被#parse 
        的模板中还可以再包含#parse声明，默认的深度为10，这是由配置参数directive.parse.max.depth在文件 
        velocity.properties中决定的，你可以修改它以适合项目要求。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;7、使用Foreach语句</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        上面多次列出Foreach语句，相信已经知道它的作用。即循环列出一组对象集合。比如：#foreach($p in 
        $ps)，其中$ps需要与后台代码中具体的实体类名称对应，$p代表$ps中的其中一项。上面已经提到过，即$p可以调用实体类的属性和方法。</p>
    <p>
&nbsp;&nbsp;&nbsp; （备注：#foreach 语句必须以#end结束,通过引用变量$velocityCount可以访问到NVelocity提供的计数器:）</p>
    <p>
&nbsp;&nbsp;&nbsp; 8、创建数组</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建：#set($List = [“男”,”女”])</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遍历：#foreach($Item in $List)</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        &lt;p&gt;List成员：$Item&lt;/p&gt;</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        &nbsp;#end</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出：List成员：男</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;List成员：女</p>
    <p>
        附：NVelocity常用语法指令</p>
    <p>
    </p>
    <p>
&nbsp;&nbsp;&nbsp; 对变量的引用：$ [ ! ][ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ][ } ]。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        &nbsp;在NVelocity中，对变量的引用都是以$开头加上变量名称。当使用!时表示当此变量值为空时，显示空字符串。比如当$article为空，那会显示“$article“，而$!article会显示为“”。{}为变量名称限定，有时候变量名称后会有字符串，这是就需要用到{}了。比如$articleshow，想引用$article，这时只要修改为${article}就可以。其实，NVelocity对整个模板解析后都会变成这种模式。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;对属性的引用：$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[a..z, A..Z 
        ][ a..z, A-Z, 0..9, -, _ ]* [ } ] 。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;例如$article.Title或者${article.Title}。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;对方法的引用：$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[ a..z, 
        A..Z ][ a..z, A..Z, 0..9, -, _ ]*( [ optional parameter list... &nbsp;] ) [ &nbsp;} ]。</p>
    <p>
&nbsp;&nbsp;&nbsp; 
        &nbsp;例如：$article.GetListByTitle(‘nvelocity’)或${article.GetListByTitle(‘nvelocity’)}。其实对对象的属性值也可以用$article.get_Title()获得。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;赋值指令#set：# [ { ] set [ } ] &nbsp;( $ref = [ &quot;, &#39; ]arg[ &quot;, &#39; ] )。</p>
    <p>
&nbsp;&nbsp;&nbsp; 
        &nbsp;例如：$article.Title=’NVelocity’，$$article.Categories=[1,2,3]，当然右侧也可以使用复杂的表达式：$article.Title=$otherArticle.Title.SubString(0,3)，算术表达式：$article.Page=4/3等等。属性赋值也可以用$article.set_Title(‘NVelocity’)。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;条件指令#if：# [ { ] if [ } ] ( [condition] ) [output] [ # [ { ] elseif [ 
        } ] ( [condition] ) [output] ]* [ # [ { ] else [ } ] [output] ] # [ { ] end [ } 
        ] 。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;条件可以是返回bool的复查表达式。例如：#if($article.Total&gt;1) $article.Title #else 没有数据 
        #end。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;循环指令#foreach：# [ { ] foreach [ } ] ($refinarg)statement# [ { ] end [ 
        } ]。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;例如：#foreach($article in $articles) $article.Title #end。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;引用静态资源指令#include：# [ { ] include [ } ] ( arg[ arg2 ... argn] )。</p>
    <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        例如：#include(‘tmp.js’)，会把tmp.js文件内容插入当前流。当然可以使用表达式：#include($article.Url)。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;引用并解析资源指令#parse：# [ { ] parse [ } ] ( arg )。</p>
    <p>
&nbsp;&nbsp;&nbsp; 
        &nbsp;例如：#parse(‘tmp.js’)，与#include不同是，假如tmp.js文件中有NVelocity的指令，变量会进行处理，并把结果插入到当前流。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;停止指令#stop：# [ { ] stop [ } ] 。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;当NVelocity解析到此指令时，会停止解析过程。一般用户调试。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;计算指令#evaluate：# [ { ] evaluate [ } ] ( arg )。</p>
    <p>
&nbsp;&nbsp;&nbsp; &nbsp;例如：#evaluate(‘$article.Title’)，会在当前输出$article.Title</p>
    <p>
        <span class="Apple-style-span" 
            style="color: #333333; font-family: Arial, Tahoma, Verdana, sans-serif; line-height: 25px; background-color: #f7fcff;">
        <span style="font-size: 14pt;"><strong>NVelocity的$与Jquery的$发生冲突时的解决方法有以下几个：&nbsp;</strong></span><br 
            style="padding: 0px; margin: 0px;" />
        1、&nbsp;<br style="padding: 0px; margin: 0px;" />
        使用jQuery.noConflict。 如：var j = jQuery.noConflict(); j.ajax();&nbsp;<br 
            style="padding: 0px; margin: 0px;" />
        缺点：当使用jQuery的相关插件时,会使得插件失效哦！&nbsp;<br style="padding: 0px; margin: 0px;" />
        2、&nbsp;<br style="padding: 0px; margin: 0px;" />
        使用jQuery代替$. 如:jQuery.ajax();&nbsp;<br style="padding: 0px; margin: 0px;" />
        缺点：不适合扩展，一旦替换成第三方库时，那就麻烦大发&nbsp;<br style="padding: 0px; margin: 0px;" />
        3、&nbsp;<br style="padding: 0px; margin: 0px;" />
        wrap jQuery中的冲突方法。&nbsp;<br style="padding: 0px; margin: 0px;" />
        如$.ajax()在Velocity中会冲突，则重新定义如下：&nbsp;<br style="padding: 0px; margin: 0px;" />
        function dw(){}&nbsp;<br style="padding: 0px; margin: 0px;" />
        dw.ajax=function(s){ jQuery.ajax(s); } dw.ajax();&nbsp;<br 
            style="padding: 0px; margin: 0px;" />
        4、&nbsp;<br style="padding: 0px; margin: 0px;" />
        定义一个$JQ为$.　以后在js 中就可以用${JQ}AJAX了．&nbsp;<br style="padding: 0px; margin: 0px;" />
        在前台这样写(定义):#set($JQ=&quot;$.&quot;)&nbsp;</span></p>


</body>
</html>
